package pers.sakurasora.changeoveramount.util;

/**
 * @FileName InputFormatUtil.java 
 * @author SakuraSora
 * @Email 1468071675@qq.com
 * @DateTime 2019年1月16日 上午11:48:04
 *
 * @Description
 *				检验用户输入的数据格式是否合法
 */
public class InputFormatUtil {
	/**
	 * 匹配由最大16位整数和2位小数组成合法金额的字符串的正则表达式
	 */
	private static String sPatternMoney = "(^[1-9][0-9]{0,15}$)|((^[1-9][0-9]{0,15}[.][0-9]{1,2})$)|(^0[.][0-9]{1,2}$)|(^0{1}$)";
	
	/**
	 * 使用正则表达式匹配金额格式（包括长度限定）：<br>
	 *    判断传入的字符串是不是由最大16位整数和2位小数组成的合法金额（金额可以是整数）
	 * @param sMoney 金额字符串
	 * @return
	 * 			匹配--true<br>
	 * 			不匹配--false<br>
	 * @throws Exception
	 */
	public static boolean moneyPattern(String sMoney)
        throws Exception 
	{
		if (sMoney.matches(sPatternMoney)) {
			return true;
		} else {
			throw new Exception("输入金额不合法！");
		}
	}
	
	/**
	 * 检查金额格式（不使用使用正则表达式）：<br>
	 *    判断传入的字符串是不是由最大16位整数和2位小数组成的合法金额（金额可以是整数）
	 * @param sMoney 金额字符串
	 * @return
	 * 			匹配--true<br>
	 * 			不匹配--false<br>
	 * @throws Exception
	 */
	public static boolean moneyCheck(String sMoney)
        throws Exception 
	{
		boolean result = true;
		int count = 0;
		
		/**
		 * 1、如果包含数字和小数点以外的字符，抛出异常<br>
		 * 2、小数点只能出现一次<br>
		 * 3、第一个和最后一个字符只能是数字<br>
		 * 4、整数部分长度大于1（2位以上）时不能以0开头（分有小数点和没小数点的情况）<br>
		 * 5、长度超出限制，抛出异常
		 */
		for (int i = 0; i < sMoney.length(); i++) {
			if (sMoney.charAt(i) != '.' && (sMoney.charAt(i) < '0' || sMoney.charAt(i) > '9')) {
				result = false;
				throw new Exception("不是合法金额！");
			}
			if (sMoney.charAt(i) == '.') {
				count++;
			}
		}
		if (count > 1) {
			result = false;
			throw new Exception("不是合法金额！");
		}
		
		if ((sMoney.charAt(0) < '0' || sMoney.charAt(0) > '9') || (sMoney.charAt(sMoney.length()-1) < '0' || sMoney.charAt(sMoney.length()-1) > '9')) {
			result = false;
			throw new Exception("不是合法金额！");
		}
		
		if (sMoney.contains(".")) {
			String[] money = sMoney.split("\\.");
			if (money[0].length() >= 2 && sMoney.charAt(0) == '0') {
				result = false;
				throw new Exception("不是合法金额！");
			}
		} else {
			if (sMoney.length() >= 2 && sMoney.charAt(0) == '0') {
				result = false;
				throw new Exception("不是合法金额！");
			}
		}
		
		if (sMoney.contains(".")) {
			String[] money = sMoney.split("\\.");
			if (money[0].length() > 16) {
				result = false;
				throw new Exception("数值过大无法计算！");
			}
			if (money[1].length() > 2) {
				System.out.println("警告：转换时将舍去“分”以后的数值！");
			}
		} else {
			if (sMoney.length() > 16) {
				result = false;
				throw new Exception("数值过大无法计算！");
			}
		}
		return result;
	}
	
	/**
	 * 判断传入的金额字符串是否不为空
	 * @param sMoney 金额字符串
	 * @return
	 * 			不为空--true<br>
	 * 			为空--false<br>
	 * @throws Exception
	 */
	public static boolean isMoneyNotEmpty(String sMoney)
        throws Exception 
	{
		if (sMoney != null && sMoney.equals("")) {
			return true;
		} else {
			throw new Exception("金额为空！");
		}
	}
}
